type calcFnType = (num1: number, num2: number) => number
//  多余的参数不会省略
function calc(calcFn:calcFnType) {
  const num1 = 10
  const num2 = 20
  const res = calcFn(num1, num2)
  console.log(res)
}

function sum(num1: number, num2: number) {
  return num1 + num2
}
calc(sum)

function mul(num1: number, num2: number) {
  return num1 * num2
}
calc(mul)

// TS对传入的函数类型参数概述不进行检测（forEach匿名函数参数不需要全写）
function foo(num1: string) {
  return num1
}

// calc(foo)
calc((num1, num2) => {
  return num1 + num2
})

// eg
interface IPerson {
  name: string
  age: number
}

const p = {
  name: 'why',
  age: 10,
  address: 'abcd'
}
// 虽然p定义没有报错（TS只读第一次初始化（新鲜的）的变量进行校验），但是实际上依旧不能读取到address属性
const info: IPerson = p
// console.log(info.name, info.age, info?.address)

export {}